﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<array>
using namespace std;

struct Point
{
	int _x;
	int _y;
};

class Date
{
public:
    Date(int year = 1, int month = 1, int day = 1)
        :_year(year)
        , _month(month)
        , _day(day)
    {
        cout << "Date(int year, int month, int day)" << endl;
    }
    Date(const Date& d)
        :_year(d._year)
        , _month(d._month)
        , _day(d._day)
    {
        cout << "Date(const Date& d)" << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};


// ⼀切皆可⽤列表初始化，且可以不加 =
/*int main()
{
	int a1[] = { 1,2,3,4,5 };
	int a2[5] = { 0 };
	Point p = { 1,2 };
	int x1 = { 2 };//变量也可以这样初始化

    Date d1 ={ 2024,1,14 };
    //Date d1{ 2024,1,14 };可以不加 =
    
    //  这⾥ d2引⽤的是{ 2024, 7, 25 }构造的临时对象
    const Date& d2= { 2024, 7, 25 };
	return 0;
}*/

//int main()
//{
//    Date d1 = { 2024,11,14 };//必须和构造函数的参数一样
//    vector<int> s = { 2024,11,13,12 };//列表可以有多个值
//
//    return 0;
//}

int main()
{
    std::initializer_list<int> mylist;//std::initializer_list本质是底层开⼀个数组，将数据拷⻉过来，std::initializer_list内部有两个指针分别指向数组的开始和结束。
    mylist = { 10, 20, 30 };
    cout << sizeof(mylist) << endl;

    // 这⾥ begi和end返回的值initializer_list对象中存的两个指针
    // 这两个指针的值跟i的地址跟接近，说明数组存在栈上
    int i = 0;
    cout << mylist.begin() << endl;
    cout << mylist.end() << endl;
    cout << &i << endl;

    //  这⾥是pair对象的{}初始化和 map的 initializer_list构造结合到⼀起⽤了
    map<string, string> dict = { {"sort", "排序"}, {"string", "字符串"}};//多个值构成的初始化对象
    return 0;
}


//静态数组越界
/*int main()
{
    // 静态数组越界的检查
    int a[10] = { 0 };

    cout << a[10] << endl;
    cout << a[11] << endl;//读的时候越界检查不到

    //a[10] = 1;写的时候可以检查到
    //a[11] = 1;

    a[15] = 1;//这样越界是ok的

    // 越界检查很严格;如果>10会报错
    array<int, 10> arr;
    cout << arr[10] << endl;

    vector<int> v(10, 0);

    return 0;
}*/